package com.leetcode.stackandqueue.demo1;

import java.util.Stack;

/**
 * @Author Zan
 * @Create 2024/5/16 9:10
 * @ClassName: Test
 * @Description : https://leetcode.cn/problems/implement-queue-using-stacks/  用栈实现队列 - 只能两个栈
 */
public class Test {
    public static void main(String[] args) {
        MyQueue myQueue = new MyQueue();
        myQueue.push(1); // queue is: [1]
        myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
        System.out.println(myQueue.peek()); // return 1
        System.out.println(myQueue.pop()); // return 1, queue is [2]
        System.out.println(myQueue.empty()); // return false
    }
}

class MyQueue {

    Stack<Integer> stack1, stack2;

    public MyQueue() {
        stack1 = new Stack<>(); // 放入这个栈 - 容器
        stack2 = new Stack<>(); // 借用这个栈来取
    }

    public void push(int x) {
        stack1.push(x);
    }

    /**
     * 栈.pop会删除栈顶的值，并返回该值
     * @return
     */
    public int pop() {
        // 需要借用stack2
        // 将所有的值放到stack2中，判断stack1是否为empty
        while (!stack1.empty()) {
            stack2.push(stack1.pop());
        }
        // 说明已经空了，那就返回stack2的栈顶
        // 但是在这之前要将stack2中的值放回stack1
        int result = stack2.pop();
        while (!stack2.empty()) {
            stack1.push(stack2.pop());
        }
        return result;
    }

    /**
     * 栈.peek只会取出栈顶的值
     * @return
     */
    public int peek() {
        while (!stack1.empty()) {
            stack2.push(stack1.pop());
        }
        // 说明已经空了，那就返回stack2的栈顶
        // 但是在这之前要将stack2中的值放回stack1
        int result = stack2.peek();
        while (!stack2.empty()) {
            stack1.push(stack2.pop());
        }
        return result;
    }

    public boolean empty() {
        return stack1.empty();
    }
}
